


from openai import OpenAI
import os
import jsonlines
from tqdm import tqdm
import json
import re

teacher_prompt = """
你是一位经验丰富、和蔼可亲的小学数学老师，致力于帮助学生掌握数学知识，培养他们的思维能力。在教学过程中，你会采用以下教学方法：
提问引导
提出问题启发学生思考，帮助他们理解知识点。例如在讲解应用题时，会问 “这道题里的已知条件有哪些？”“我们要求的是什么？” 等问题。
当学生回答不完整或不准确时，通过进一步的引导性问题帮助他们完善答案，如 “再仔细看看题目，还有其他的已知条件吗？”
知识点解释
用通俗易懂的语言解释数学概念和解题方法，确保学生能够理解。
结合具体的例子或实际生活场景，让抽象的数学知识变得更加直观易懂。比如在讲解加减法时，用买东西找零的例子来帮助学生理解。
如果学生对某个知识点提出疑问，耐心地再次解释，直到他们明白为止。
错误纠正
当学生回答错误时，温和地指出错误，分析错误原因。例如 “你的思路有一点偏差，这里应该是……”
引导学生自己发现错误，鼓励他们再次尝试回答问题，如 “再想一想，看看能不能找到正确的答案。”
总结归纳
在讲解完一道题目或一个知识点后，及时进行总结，强调重点和易错点。
鼓励学生提出问题，确保他们对所学内容完全掌握。例如 “对于这个知识点，大家还有什么疑问吗？”
"""
student_prompt = """
你是一名正在学习小学数学的学生，对知识充满渴望，但有时会因为理解不深或粗心犯错。面对老师的提问，你要认真思考，根据自己的理解如实回答：
当老师解释知识点时，认真聆听，如果有疑问，可以礼貌地提出，如 “老师，您说的 [具体不理解的点] 我不太明白，可以再解释一下吗？”
回答老师的引导性问题，尽量简洁明了，比如老师问 “这道题里的已知条件有哪些？”，你可以回答 “已知条件是 [具体条件]”。
如果回答错误，认真听取老师指出的错误原因，努力理解并再次尝试回答，如 “老师，我明白了，我再想一下，这次答案应该是 [新答案]”。
跟随老师的引导，逐步学习解题方法，当老师总结知识点时，认真记忆，有问题可以及时提问。
"""


def make_data(key="sk-232341959c34456795ec5c07d0df3e1b",start_index=447,save_file_path="/mnt/lth/llm/make_dataset/q3.jsonl"):

    # 初始化OpenAI客户端
    client = OpenAI(
        api_key=key,
        base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"
    )

    qcs = list(jsonlines.open("/mnt/lth/llm/make_dataset/output.jsonl", 'r'))
    q3 = jsonlines.open(save_file_path, "a")
    qcs = qcs[start_index:]
    for qc in tqdm(qcs):
        chinese_question = qc["question_chinese"]
        reasoning_content = ""  # 定义完整思考过程
        answer_content = ""     # 定义完整回复
        is_answering = False
        # 构建完整的输入，包含老师和学生的角色设定以及学生的问题
        full_prompt = f"老师是{teacher_prompt}\n学生是{student_prompt}\n学生向老师提问：{chinese_question}\n请模拟老师和学生完整的一问一答过程，以'老师：'和'学生：'开头来区分角色。，其中由学生提出问题开始展开对话"

        
        # 调用API生成对话
        completion = client.chat.completions.create(
            model="qwen-plus",
            messages=[
                {"role": "user", "content": full_prompt}
            ],
            stream=True
        )
        for chunk in completion:
            # 如果chunk.choices为空，则打印usage
            if not chunk.choices:
                print("\nUsage:")
                print(chunk.usage)
            else:
                delta = chunk.choices[0].delta
                # 打印思考过程
                if hasattr(delta, 'reasoning_content') and delta.reasoning_content is not None:
                    # print(delta.reasoning_content, end='', flush=True)
                    reasoning_content += delta.reasoning_content
                else:
                    # 开始回复
                    if delta.content != "" and is_answering is False:
                        # print("\n" + "=" * 20 + "完整回复" + "=" * 20 + "\n")
                        is_answering = True
                    # 打印回复过程
                    # print(delta.content, end='', flush=True)
                    answer_content += delta.content
        print(answer_content)
        q3.write({
            "chinese_question":chinese_question,
            "reasoning":reasoning_content,
            "conversation":answer_content
        })
        

    q3.close()


def convert_data_position(key="sk-232341959c34456795ec5c07d0df3e1b",target_file_path="",save_file_path=""):

    client = OpenAI(
        api_key=key,
        base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"
    )

    json_data = json.load(open(target_file_path,'r',encoding='utf-8'))
    f = open(save_file_path,'a')
    collect_data = []
    for jd in tqdm(json_data):
        chat = jd

        reasoning_content = ""
        answer_content = ""

        is_answering = False

        example = [{"from": "学生", "value": "老师，这道题该怎么做呢？"}]
        full_prompt = f"请将以下由老师提出的问题修改为学生提问，输出格式需和下面示例一致：{json.dumps(example)}。句子如下："
        id = chat['id']
        conversations = chat['conversations']
        conversations = full_prompt+"```json"+json.dumps(conversations).encode('utf-8').decode('unicode_escape')+"```"
        # print(conversations)
        # break
        completion = client.chat.completions.create(
            model="qwen-plus",
            messages=[
                {'role':"user","content":conversations}
            ],
            stream=True
        )

        for chunk in completion:
            delta = chunk.choices[0].delta
            # 开始回复
            if delta.content != "" and is_answering is False:
                # print("\n" + "=" * 20 + "完整回复" + "=" * 20 + "\n")
                is_answering = True
            # 打印回复过程
            # print(delta.content, end='', f
            answer_content += delta.content
        answer_content = answer_content.strip()
        answer_content = answer_content.replace('\t','').replace('\n','')
        answer_content = answer_content.replace(' ','')
        if '```json' in answer_content:
            answer_content=answer_content.split("```json")[1]
        if '```' in answer_content:
            answer_content=answer_content.split("```")[0]
        answer_content = answer_content.strip().encode('utf-8').decode('unicode_escape')
        answer_content = json.loads(answer_content)        
        collect_data.append(answer_content)
        json.dump(collect_data,f)






if __name__ == "__main__":
    make_data(
        key="sk-06836f9701fc43d9aeb0e8022e35d5f6",
        start_index=0,
        save_file_path="/mnt/lth/llm/make_dataset/q3_3.jsonl"
    )

    # convert_data_position(
    #     key="sk-06836f9701fc43d9aeb0e8022e35d5f6",
    #     target_file_path="/mnt/lth/llm/make_dataset/q3-convert.json",
    #     save_file_path="/mnt/lth/llm/make_dataset/q3-convert2.json"
    # )